package co.edu.usbcali.sam.presentation.backingBeans;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.TimeZone;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.component.html.HtmlSelectOneMenu;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;

import org.primefaces.component.commandbutton.CommandButton;
import org.primefaces.component.inputtext.InputText;
import org.primefaces.context.RequestContext;
import org.primefaces.event.RowEditEvent;

import co.edu.usbcali.sam.exceptions.ZMessManager;
import co.edu.usbcali.sam.modelo.Asignaturas;
import co.edu.usbcali.sam.modelo.dto.AsignaturasDTO;
import co.edu.usbcali.sam.modelo.dto.ProfesoresDTO;
import co.edu.usbcali.sam.presentation.businessDelegate.IBusinessDelegatorView;
import co.edu.usbcali.sam.presentation.datamodel.AsignaturaDataModel;
import co.edu.usbcali.sam.utilities.FacesUtils;


/**
 * @author Zathura Code Generator http://code.google.com/p/zathura
 * www.zathuracode.org
 *
 */
@ManagedBean
@ViewScoped
public class AsignaturasEstudiantesView implements Serializable {
    private static final long serialVersionUID = 1L;
    private InputText txtNombre;
    private InputText txtIdAsignatura;
    private CommandButton btnSave;
    private CommandButton btnModify;
    private CommandButton btnDelete;
    private CommandButton btnClear;
    private CommandButton btnCrear;
    private HtmlSelectOneMenu cmbidProfesor;
    private List<AsignaturasDTO> data;
    private AsignaturasDTO selectedAsignaturas;
    private Asignaturas entity;
    private boolean showDialog;
    @ManagedProperty(value = "#{BusinessDelegatorView}")
    private IBusinessDelegatorView businessDelegatorView;
    private AsignaturaDataModel asignaturaModel;
    private Long idProfesorSel;
    List<SelectItem> idProfesor= new ArrayList<SelectItem>();
    private List<ProfesoresDTO> lstProfesores = new ArrayList<ProfesoresDTO>();

    public AsignaturasEstudiantesView() {
        super();
    }
    
    @PostConstruct
    public void cargarDatos() {
    	try {
			lstProfesores = businessDelegatorView.getDataProfesores();
			
			for (ProfesoresDTO profesor : lstProfesores) {
				idProfesor.add(new SelectItem(profesor.getIdProfesor(), profesor.getNombreCompleto()));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
    }

    //Habilita los campos y desabilita el boton crear
  	public String crear() {

  		txtNombre.setDisabled(false);
  		txtNombre.setValue(null);

  		btnSave.setDisabled(false);
  		btnCrear.setDisabled(true);

  		return "";
  	}

  	//Limpia los campos, Habilita los botones de Crear y Modificar
  	public void cerrar() {

  		txtNombre.setDisabled(true);

  		if (btnCrear.isDisabled()) {
  			txtNombre.setValue("");
  		}

  		btnSave.setDisabled(true);
  		btnModify.setDisabled(false);
  		btnCrear.setDisabled(false);
  	}


  	//Coloca los datos del DTO seleccionado en las variables de Binding txt
  	public String editar() {

  		try {
  			txtNombre.setValue(selectedAsignaturas.getNombre());

  			modificar();
	  	    RequestContext.getCurrentInstance().execute("PF('singleCarDialog').show()");

  		} catch (Exception e) {
  			if (selectedAsignaturas == null) {
  				btnCrear.setDisabled(true);
  				cerrar();
  				FacesUtils.addErrorMessage("Seleccione Asignatura a Modificar");
  			}
  		}
  		return "";
  	}

  	//Habilita los campos y desabilita el boton Modificar
  	public String modificar() {

  		txtNombre.setDisabled(false);

  		btnSave.setDisabled(false);
  		btnModify.setDisabled(true);

  		return "";
  	}

  	//Metodo que guarda un nuevo tipodoc y cierra el dialogo
  	public String action_create() {
  		try {
  			entity = new Asignaturas();

  			entity.setNombre(FacesUtils.checkString(txtNombre));

  			businessDelegatorView.saveAsignaturas(entity);

  			cerrar();

  			data = businessDelegatorView.getDataAsignaturas();

  				asignaturaModel = new AsignaturaDataModel(data);
  			RequestContext.getCurrentInstance().execute(
  					"PF('singleCarDialog').hide()");
  			RequestContext.getCurrentInstance().update("form:tabla");
  			FacesUtils.addInfoMessage("La Asignatura se creo con �xito");

  		} catch (Exception e) {
  			entity = null;
  			FacesUtils.addErrorMessage(e.getMessage());
  		}

  		return "";
  	}

  	//Metodo que guarda un tipodoc modificado
  	public String action_modify() {
  		try {
  			//si crear esta habilitado entonces esta modificando
  			if (btnCrear.isDisabled()) {
  				action_create();

  				return "";
  			}

  			Long idTpDoc = new Long(selectedAsignaturas.getIdAsignatura());
  			entity = businessDelegatorView.getAsignaturas(idTpDoc);

  			entity.setNombre(FacesUtils.checkString(txtNombre));
  			businessDelegatorView.updateAsignaturas(entity);

  			cerrar();
  			data = businessDelegatorView.getDataAsignaturas();
  			asignaturaModel = new AsignaturaDataModel(data);
  			RequestContext.getCurrentInstance().execute(
  					"PF('singleCarDialog').hide()");
  			RequestContext.getCurrentInstance().update("form:tabla");
  			FacesUtils
  					.addInfoMessage("La Asignatura se modifico con �xito");
  		} catch (Exception e) {
  			data = null;
  			FacesUtils.addErrorMessage(e.getMessage());
  		}

  		return "";
  	}

  	// ///////////////////////////////////////////////////////////////////////////
    
    
    public void rowEventListener(RowEditEvent e) {
        try {
            AsignaturasDTO asignaturasDTO = (AsignaturasDTO) e.getObject();

            if (txtNombre == null) {
                txtNombre = new InputText();
            }

            txtNombre.setValue(asignaturasDTO.getNombre());

            if (txtIdAsignatura == null) {
                txtIdAsignatura = new InputText();
            }

            txtIdAsignatura.setValue(asignaturasDTO.getIdAsignatura());

            Long idAsignatura = FacesUtils.checkLong(txtIdAsignatura);
            entity = businessDelegatorView.getAsignaturas(idAsignatura);

            action_modify();
        } catch (Exception ex) {
        }
    }

    public String action_new() {
        action_clear();
        selectedAsignaturas = null;
        setShowDialog(true);

        return "";
    }

    public String action_clear() {
        entity = null;
        selectedAsignaturas = null;

        if (txtNombre != null) {
            txtNombre.setValue(null);
            txtNombre.setDisabled(true);
        }

        if (txtIdAsignatura != null) {
            txtIdAsignatura.setValue(null);
            txtIdAsignatura.setDisabled(false);
        }

        if (btnSave != null) {
            btnSave.setDisabled(true);
        }

        if (btnDelete != null) {
            btnDelete.setDisabled(true);
        }

        return "";
    }

    public void listener_txtId() {
        try {
            Long idAsignatura = FacesUtils.checkLong(txtIdAsignatura);
            entity = (idAsignatura != null)
                ? businessDelegatorView.getAsignaturas(idAsignatura) : null;
        } catch (Exception e) {
            entity = null;
        }

        if (entity == null) {
            txtNombre.setDisabled(false);
            txtIdAsignatura.setDisabled(false);
            btnSave.setDisabled(false);
        } else {
            txtNombre.setValue(entity.getNombre());
            txtNombre.setDisabled(false);
            txtIdAsignatura.setValue(entity.getIdAsignatura());
            txtIdAsignatura.setDisabled(true);
            btnSave.setDisabled(false);

            if (btnDelete != null) {
                btnDelete.setDisabled(false);
            }
        }
    }

    public String action_edit(ActionEvent evt) {
        selectedAsignaturas = (AsignaturasDTO) (evt.getComponent()
                                                   .getAttributes()
                                                   .get("selectedAsignaturas"));
        txtNombre.setValue(selectedAsignaturas.getNombre());
        txtNombre.setDisabled(false);
        txtIdAsignatura.setValue(selectedAsignaturas.getIdAsignatura());
        txtIdAsignatura.setDisabled(true);
        btnSave.setDisabled(false);
        setShowDialog(true);

        return "";
    }

    public String action_save() {
        try {
            if ((selectedAsignaturas == null) && (entity == null)) {
                action_create();
            } else {
                action_modify();
            }

            data = null;
        } catch (Exception e) {
            FacesUtils.addErrorMessage(e.getMessage());
        }

        return "";
    }

 /*   public String action_create() {
        try {
            entity = new Asignaturas();

            Long idAsignatura = FacesUtils.checkLong(txtIdAsignatura);

            entity.setIdAsignatura(idAsignatura);
            entity.setNombre(FacesUtils.checkString(txtNombre));
            businessDelegatorView.saveAsignaturas(entity);
            FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYSAVED);
            action_clear();
        } catch (Exception e) {
            entity = null;
            FacesUtils.addErrorMessage(e.getMessage());
        }

        return "";
    }

    public String action_modify() {
        try {
            if (entity == null) {
                Long idAsignatura = new Long(selectedAsignaturas.getIdAsignatura());
                entity = businessDelegatorView.getAsignaturas(idAsignatura);
            }

            entity.setNombre(FacesUtils.checkString(txtNombre));
            businessDelegatorView.updateAsignaturas(entity);
            FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYMODIFIED);
        } catch (Exception e) {
            data = null;
            FacesUtils.addErrorMessage(e.getMessage());
        }

        return "";
    }*/

    public String action_delete_datatable(ActionEvent evt) {
        try {
            selectedAsignaturas = (AsignaturasDTO) (evt.getComponent()
                                                       .getAttributes()
                                                       .get("selectedAsignaturas"));

            Long idAsignatura = new Long(selectedAsignaturas.getIdAsignatura());
            entity = businessDelegatorView.getAsignaturas(idAsignatura);
            action_delete();
        } catch (Exception e) {
            FacesUtils.addErrorMessage(e.getMessage());
        }

        return "";
    }

    public String action_delete_master() {
        try {
            Long idAsignatura = FacesUtils.checkLong(txtIdAsignatura);
            entity = businessDelegatorView.getAsignaturas(idAsignatura);
            action_delete();
        } catch (Exception e) {
            FacesUtils.addErrorMessage(e.getMessage());
        }

        return "";
    }

    public void action_delete() throws Exception {
        try {
            businessDelegatorView.deleteAsignaturas(entity);
            FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYDELETED);
            action_clear();
            data = null;
        } catch (Exception e) {
            throw e;
        }
    }

    public String action_closeDialog() {
        setShowDialog(false);
        action_clear();

        return "";
    }

    public String actionDeleteDataTableEditable(ActionEvent evt) {
        try {
            selectedAsignaturas = (AsignaturasDTO) (evt.getComponent()
                                                       .getAttributes()
                                                       .get("selectedAsignaturas"));

            Long idAsignatura = new Long(selectedAsignaturas.getIdAsignatura());
            entity = businessDelegatorView.getAsignaturas(idAsignatura);
            businessDelegatorView.deleteAsignaturas(entity);
            data.remove(selectedAsignaturas);
            FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYDELETED);
            action_clear();
        } catch (Exception e) {
            FacesUtils.addErrorMessage(e.getMessage());
        }

        return "";
    }

    public String action_modifyWitDTO(Long idAsignatura, String nombre)
        throws Exception {
        try {
            entity.setNombre(FacesUtils.checkString(nombre));
            businessDelegatorView.updateAsignaturas(entity);
            FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYMODIFIED);
        } catch (Exception e) {
            //renderManager.getOnDemandRenderer("AsignaturasView").requestRender();
            FacesUtils.addErrorMessage(e.getMessage());
            throw e;
        }

        return "";
    }
    
    public void serviceChangeProfesor(){
    	try {
    		
    		System.out.println("id::"+idProfesorSel);
    		data = businessDelegatorView.getDataAsignaturasByProfesor(idProfesorSel);
  			asignaturaModel = new AsignaturaDataModel(data);
  			RequestContext.getCurrentInstance().execute(
  					"PF('singleCarDialog').hide()");
  			RequestContext.getCurrentInstance().update("form:tabla");
		} catch (Exception e) {
			data = null;
  			FacesUtils.addErrorMessage(e.getMessage());
		}
    }

    public InputText getTxtNombre() {
        return txtNombre;
    }

    public void setTxtNombre(InputText txtNombre) {
        this.txtNombre = txtNombre;
    }

    public InputText getTxtIdAsignatura() {
        return txtIdAsignatura;
    }

    public void setTxtIdAsignatura(InputText txtIdAsignatura) {
        this.txtIdAsignatura = txtIdAsignatura;
    }

    public List<AsignaturasDTO> getData() {
        try {
            if (data == null) {
                data = businessDelegatorView.getDataAsignaturas();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return data;
    }

    public void setData(List<AsignaturasDTO> asignaturasDTO) {
        this.data = asignaturasDTO;
    }

    public AsignaturasDTO getSelectedAsignaturas() {
    	if(selectedAsignaturas==null){
    		try {
    			selectedAsignaturas=getData().get(0);
			} catch (Exception e) {
			} 
    	}
        return selectedAsignaturas;
    }

    public void setSelectedAsignaturas(AsignaturasDTO asignaturas) {
        this.selectedAsignaturas = asignaturas;
    }

    public CommandButton getBtnSave() {
        return btnSave;
    }

    public void setBtnSave(CommandButton btnSave) {
        this.btnSave = btnSave;
    }

    public CommandButton getBtnModify() {
        return btnModify;
    }

    public void setBtnModify(CommandButton btnModify) {
        this.btnModify = btnModify;
    }

    public CommandButton getBtnDelete() {
        return btnDelete;
    }

    public void setBtnDelete(CommandButton btnDelete) {
        this.btnDelete = btnDelete;
    }

    public CommandButton getBtnClear() {
        return btnClear;
    }

    public void setBtnClear(CommandButton btnClear) {
        this.btnClear = btnClear;
    }

    public TimeZone getTimeZone() {
        return java.util.TimeZone.getDefault();
    }

    public IBusinessDelegatorView getBusinessDelegatorView() {
        return businessDelegatorView;
    }

    public void setBusinessDelegatorView(
        IBusinessDelegatorView businessDelegatorView) {
        this.businessDelegatorView = businessDelegatorView;
    }

    public boolean isShowDialog() {
        return showDialog;
    }

    public void setShowDialog(boolean showDialog) {
        this.showDialog = showDialog;
    }

	public CommandButton getBtnCrear() {
		return btnCrear;
	}

	public void setBtnCrear(CommandButton btnCrear) {
		this.btnCrear = btnCrear;
	}

	public AsignaturaDataModel getAsignaturaModel() {
		try {
			asignaturaModel=new AsignaturaDataModel(getData());
		} catch (Exception e) {
		}
		return asignaturaModel;
	}

	public void setAsignaturaModel(AsignaturaDataModel asignaturaModel) {
		this.asignaturaModel = asignaturaModel;
	}

	public HtmlSelectOneMenu getCmbidProfesor() {
		return cmbidProfesor;
	}

	public void setCmbidProfesor(HtmlSelectOneMenu cmbidProfesor) {
		this.cmbidProfesor = cmbidProfesor;
	}

	public Long getIdProfesorSel() {
		return idProfesorSel;
	}

	public void setIdProfesorSel(Long idProfesorSel) {
		this.idProfesorSel = idProfesorSel;
	}

	public List<SelectItem> getIdProfesor() {
		return idProfesor;
	}

	public void setIdProfesor(List<SelectItem> idProfesor) {
		this.idProfesor = idProfesor;
	}

	public List<ProfesoresDTO> getLstProfesores() {
		return lstProfesores;
	}

	public void setLstProfesores(List<ProfesoresDTO> lstProfesores) {
		this.lstProfesores = lstProfesores;
	}
    
    
}
